<?php

class BoolExpr
{

  public static function parse($expr)
  {
    if (empty($expr)) {
      return null;
    }

    if (! is_array($expr)) {
      return $expr;
    }

    if (count($expr) == 1) {
      return $expr[0];
    }

    $parsed = array();

    $a = $c = array_shift($expr);

    $parsed[] = BoolExpr::parse($a);

    $op = null;

    while (count($expr)) {
      $b = array_shift($expr);

      $or = false;
      if (is_array($c) || is_array($b)) {
        $or = true;
      }

      if ($or == $op) {
        $parsed[] = BoolExpr::parse($b);
      }
      else {
        if (is_array($parsed)) {
          $parsed = BoolExpr::parse($parsed);
        }
        $parsed = '('.implode($op ? ' OR ' : ' AND ', (array) $parsed).')';
        $parsed = array($parsed, BoolExpr::parse($b));
      }

      $op = $or;
      $c = $b;
    }

    $s = '('.implode($op ? ' OR ' : ' AND ', $parsed).')';

    return $s;
  }

}

?>